/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ClientsSide;

/**
 *
 * @author Pedro Costa Correia - 32795
 * @author Valter Pedro Lopes Vicente - 39360
 */
public class Craftsman extends Thread {

    /**
     *  Valor máximo de armazenamento de produtos na oficina.
     *
     *    @serialField MAX
     */
    private final int MAX = 10;
    /**
     *  Identificação do artesão.
     *
     *    @serialField craftsmanId
     */
    private int craftsmanId;
    /**
     *  Nome do sistema computacional onde está localizado o servidor
     *    @serialField serverHostName
     */
    private String serverHostName = null;
    /**
     *  Número do port de escuta do servidor
     *    @serialField serverPortNumb
     */
    private int serverPortNumb;

    /**
     *  Instanciação da thread do artesão.
     *
     * @param craftsmanId Identificação do artesão.
     * @param workshop Interface do artesão associada ao monitor da oficina.
     * @param general Interface do artesão associada ao estado geral.
     */
    public Craftsman(int craftsmanId, String hostName, int port) {
        super("Craftsman_" + craftsmanId);
        this.craftsmanId = craftsmanId;
        serverHostName = hostName;
        serverPortNumb = port;
    }

    /**
     * Ciclo de vida da thread do artesão.
     */
    @Override
    public void run() {
        int np;																/* Quantidade de produtos armazenados na oficina */
        boolean alert;													/* Baixo nível de matérias primas na oficina */
        while (!workshop.endOperCraftsman(craftsmanId)) {
            alert = workshop.collectMaterials(craftsmanId);				/* O artesão retira as matérias primas que necessita para fazer o produto */
            if (alert) {
                general.primeMaterialsNeeded(craftsmanId);		/* O artesão avisa a dona de que são necessárias mais matérias primas */
                workshop.backToWork(craftsmanId);					/* O artesão regressa à sua actividade */
            }
            workshop.prepareToProduce(craftsmanId);					/* O artesão senta-se e prepara-se para trabalhar o novo produto */
            shapingItUp();												/* O artesão trabalha sobre o novo produto */
            np = workshop.goToStore(craftsmanId);						/* O artesão guarda o produto terminado */
            if (np == MAX) {											/* O artesão verifica se é altura de transferir os produtos */
                general.batchReadyForTransfer(craftsmanId);		/* O artesão notifica a dona para esta vir buscar os produtos terminados */
            }
            workshop.backToWork(craftsmanId);						/* O artesão regressa à sua actividade */
        }
    }

    /**
     *  O artesão trabalha sobre o produto (operação interna).
     */
    private void shapingItUp() {
        try {
            sleep((long) (1 + 100 * Math.random()));
        } catch (InterruptedException e) {
        }
    }
}
